package com.appleyk.repository;

import com.appleyk.model.Company;
import com.appleyk.model.Movie;
import org.apache.commons.math3.optim.linear.Relationship;
import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.neo4j.repository.Neo4jRepository;
import org.springframework.data.repository.query.Param;

import javax.management.relation.Relation;
import java.util.List;


/**
 * 基于产业链知识图谱的智能问答的查询接口
 * @author ly
 * @date   updated by 2023年3月14日
 */
public interface QuestionRepository extends Neo4jRepository<Company,Long> {

	/**
	 * 0 对应问题模板0 == in(行业) 上级行业
	 *
	 * @param industryName 行业
	 * @return 返回该行业的上级行业
	 */
	@Query("match (p:industry)-[:`上级行业`]->(x:industry) where p.name={industryName} return x.name")
	String getUpIndustry(@Param("industryName") String industryName);

	/**
	 * 1 对应问题模板1 == in(行业) 下级行业
	 *
	 * @param industryName 行业
	 * @return 返回该行业的下级行业
	 */
	@Query("match (p:industry)-[:`上级行业`]->(x:industry) where x.name={industryName} return p.name")
	List<String> getDownIndustry(@Param("industryName") String industryName);

	/**
	 * 2 对应问题模板2 == in(行业) 包含公司
	 * @param industryName 行业
	 *
	 * @return 返回该行业的所属公司
	 */
	@Query("match (p:company)-[:`所属行业`]->(x:industry) where x.name={industryName} return p.fullname")
	List<String> getDownCompany(@Param("industryName") String industryName);

	/**
	 * 3 对应问题模板3 == co(公司) 股票代码
	 *
	 * @param companyName 公司名称
	 * @return 返回该公司的股票代码
	 */
	@Query("match (n:company1) where n.fullname =~('.*'+$companyName+'.*') or n.name =~('.*'+$companyName+'.*') return n.code")
	String getCompanyCode(@Param("companyName") String companyName);

	/**
	 * 4 对应问题模板4 == co(公司) 上市地点
	 *
	 * @param companyName 公司名称
	 * @return 返回该公司的上市地点
	 */
	@Query("match (n:company1) where n.fullname =~('.*'+$companyName+'.*') or n.name =~('.*'+$companyName+'.*') return n.location")
	String getCompanyLocation(@Param("companyName") String companyName);

	/**
	 * 5 对应问题模板5 == co(公司) 上市时间
	 *
	 * @param companyName 公司名称
	 * @return 返回该公司的上市时间
	 */
	@Query("match (n:company1) where n.fullname =~('.*'+$companyName+'.*') or n.name =~('.*'+$companyName+'.*') return n.time")
	String getCompanyTime(@Param("companyName") String companyName);

	/**
	 * 6 对应问题模板6 == co(公司) 上市时间
	 *
	 * @param companyName 公司名称
	 * @return 返回该公司的全称
	 */
	@Query("match (n:company1) where n.fullname =~('.*'+$companyName+'.*') or n.name =~('.*'+$companyName+'.*') return n.fullname")
	String getCompanyFullName(@Param("companyName") String companyName);

	/**
	 * 7对应问题模板7 == co(公司) 主营产品
	 *
	 * @param companyName 公司名称
	 * @return 返回该公司的主营产品
	 */
	@Query("match (p:company)-[:`主营产品`]->(x:product) where p.fullname =~('.*'+$companyName+'.*') or p.name =~('.*'+$companyName+'.*') return x.name")
	List<String> getCompanyProduct(@Param("companyName") String companyName);

	/**
	 * 8对应问题模板8 == co(公司) 所属行业
	 *
	 * @param companyName 公司名称
	 * @return 返回该公司的所属行业
	 */
	@Query("match (p:company)-[:`所属行业`]->(x:industry) where p.fullname =~('.*'+$companyName+'.*') or p.name =~('.*'+$companyName+'.*') return x.name")
	String getCompanyIndustry(@Param("companyName") String companyName);


	/**
	 * 9对应问题模板9 == co(公司) 合作公司
	 *
	 * @param companyName 公司名称
	 * @return 返回该公司的可能合作伙伴
	 */
	@Query("match (p:company)-[:`主营产品`]->(:product)-[:`上游材料`]-(:product)<-[:`主营产品`]-(q:company) where p.fullname =~('.*'+$companyName+'.*') or p.name =~('.*'+$companyName+'.*') return q.fullname")
	List<String> getCooperateCompany(@Param("companyName") String companyName);


	/**
	 * 10 对应问题模板10 == co(公司) 竞争公司
	 *
	 * @param companyName 公司名称
	 * @return 返回该公司的可能竞争对手
	 */
	@Query("match (p:company)-[:`主营产品`]->(x:product)<-[:`主营产品`]-(q:company) where p.fullname =~('.*'+$companyName+'.*') or p.name =~('.*'+$companyName+'.*') return q.fullname")
	List<String> getCompeteCompany(@Param("companyName") String companyName);


	/**
	 * 11 对应问题模板11 == pr(产品) 产品小类
	 *
	 * @param productName 产品名
	 * @return 返回该产品的产品小类
	 */
	@Query("match (p:product)-[:`产品小类`]->(x:product) where p.name ={productName} return x.name")
	List<String> getProductSmall(@Param("productName") String productName);

	/**
	 * 12 对应问题模板12 == pr(产品) 产品大类
	 *
	 * @param productName 产品名
	 * @return 返回该产品的产品大类
	 */
	@Query("match (p:product)<-[:`产品小类`]-(x:product) where p.name ={productName} return x.name")
	List<String> getProductBig(@Param("productName") String productName);

	/**
	 * 13 对应问题模板13 == pr(产品) 下游产品
	 *
	 * @param productName 产品名
	 * @return 返回该产品的下游产品
	 */
	@Query("match (p:product)<-[:`上游材料`]-(x:product) where p.name ={productName} return x.name")
	List<String> getProductDown(@Param("productName") String productName);

	/**
	 * 14 对应问题模板14 == pr(产品) 上游材料
	 *
	 * @param productName 产品名
	 * @return 返回该产品的上游材料
	 */
	@Query("match (p:product)-[:`上游材料`]->(x:product) where p.name ={productName} return x.name")
	List<String> getProductUp(@Param("productName") String productName);

	/**
	 * 15 对应问题模板15 == pr(产品) 所属公司
	 *
	 * @param productName 产品名
	 * @return 返回该产品的所属公司
	 */
	@Query("match (p:product)<-[:`主营产品`]-(x:company) where p.name ={productName} return x.fullname")
	List<String> getProductCompany(@Param("productName") String productName);


	/**
	 * 16 对应问题模板16 == coa cob(公司) 关系
	 * 要改成查询有关系的最短路径，并匹配成文字
	 * @param name1,name2 公司名
	 * @return 返回两公司的关系
	 */
	@Query("match (x:company)-[:`所属行业`]->(i:industry)<-[:`所属行业`]-(y:company) \n" +
			"where x.name = {name1} or x.fullname = {name1} and y.name = {name2} or y.fullname = {name2}\n" +
			"return distinct(i.name)")
	List<String> getCompanyRelation1(@Param("name1") String name1, @Param("name2") String name2);

	@Query("match (x:company)-[:`主营产品`]->(p:product)<-[:`主营产品`]-(y:company)\n" +
			"where x.name = {name1} or x.fullname = {name1} and y.name = {name2} or y.fullname = {name2}\n" +
			"return distinct(p.name)")
	List<String> getCompanyRelation2(@Param("name1") String name1, @Param("name2") String name2);

	/**
	 * 17 对应问题模板17 == ina inb(行业) 关系
	 *
	 * @param name1,name2 行业名
	 * @return 返回两行业的关系
	 */
	@Query("match (x:industry)-[r:`上级行业`]->(y:industry)\n" +
			"where x.name = {name1} and  y.name={name2}\n" +
			"return type(r)")
	String getIndustryRelation1(@Param("name1") String name1, @Param("name2") String name2);

	@Query("match (x:industry)<-[r:`上级行业`]-(y:industry)\n" +
			"where x.name = {name1} and  y.name={name2}\n" +
			"return type(r)")
	String getIndustryRelation2(@Param("name1") String name1, @Param("name2") String name2);

	@Query("match (x:industry)-[:`上级行业`]->(i:industry)<-[:`上级行业`]-(y:industry)\n" +
			"where x.name = {name1} and  y.name={name2}\n" +
			"return i.name")
	String getIndustryRelation3(@Param("name1") String name1, @Param("name2") String name2);

	/**
	 * 18 对应问题模板18 == pr prb(产品) 关系
	 *
	 * @param name1,name2 行业名
	 * @return 返回两产品的关系
	 */
	@Query("match (x:product)-[r:`上游材料`]->(y:product)\n" +
			"where x.name = {name1} and  y.name={name2}\n" +
			"return type(r)")
	String getProductRelation1(@Param("name1") String name1, @Param("name2") String name2);

	@Query("match (x:product)<-[r:`上游材料`]-(y:product)\n" +
			"where x.name = {name1} and  y.name={name2}\n" +
			"return type(r)")
	String getProductRelation2(@Param("name1") String name1, @Param("name2") String name2);

	@Query("match (x:product)-[r:`下游产品`]->(y:product)\n" +
			"where x.name = {name1} and  y.name={name2}\n" +
			"return type(r)")
	String getProductRelation3(@Param("name1") String name1, @Param("name2") String name2);

	@Query("match (x:product)<-[r:`下游产品`]-(y:product)\n" +
			"where x.name = {name1} and  y.name={name2}\n" +
			"return type(r)")
	String getProductRelation4(@Param("name1") String name1, @Param("name2") String name2);

	@Query("match (x:product)-[:`上游材料`]->(p:product)<-[:`上游材料`]-(y:product)\n" +
			"where x.name = {name1} and  y.name={name2}\n" +
			"return p.name")
	String getProductRelation5(@Param("name1") String name1, @Param("name2") String name2);

	@Query("match (x:product)<-[:`产品小类`]-(p:product)-[:`产品小类`]->(y:product)\n" +
			"where x.name = {name1} and  y.name={name2}\n" +
			"return p.name")
	String getProductRelation6(@Param("name1") String name1, @Param("name2") String name2);

	@Query("match (x:product)-[r:`产品小类`]->(y:product)\n" +
			"where x.name = {name1} and  y.name={name2}\n" +
			"return type(r)")
	String getProductRelation7(@Param("name1") String name1, @Param("name2") String name2);

	@Query("match (x:product)<-[r:`产品小类`]-(y:product)\n" +
			"where x.name = {name1} and  y.name={name2}\n" +
			"return type(r)")
	String getProductRelation8(@Param("name1") String name1, @Param("name2") String name2);

	@Query("match (x:product)<-[:`主营产品`]-(c:company)-[:`主营产品`]->(y:product)\n" +
			"where x.name = {name1} and  y.name={name2}\n" +
			"return c.name")
	String getProductRelation9(@Param("name1") String name1, @Param("name2") String name2);

	/**
	 * 19 对应问题模板19 == in co(行业 公司) 关系
	 *
	 * @param name1,name2 行业名和公司名
	 * @return 返回两公司的关系
	 */
	@Query("match (x:company)-[r]->(i:industry)\n" +
			"where i.name = {name1} and x.name = {name2} or x.fullname = {name2}\n" +
			"return type(r)")
	String getIndustryCompanyRelation1(@Param("name1") String name1, @Param("name2") String name2);

	@Query("match (x:company)-[:`所属行业`]->(i:industry)-[:`上级行业`]-(y:industry)\n" +
			"where y.name = {name1} and x.name = {name2} or x.fullname = {name2}\n" +
			"return i.name")
	String getIndustryCompanyRelation2(@Param("name1") String name1, @Param("name2") String name2);

	/**
	 * 20 对应问题模板20 == co pr(行业 产品) 关系
	 *
	 * @param name1,name2 公司名和产品名
	 * @return 返回公司和产品的关系
	 */
	@Query("match (x:company)-[r:`主营产品`]->(p:product{name:{name2}})\n" +
			"where x.name = {name1} or x.fullname = {name1}\n" +
			"return type(r)")
	List<String> getCompanyProductRelation1(@Param("name1") String name1, @Param("name2") String name2);

	@Query("match (x:company)-[:`主营产品`]->(p:product)-[:`产品小类`]->(t:product{name:{name2}})\n" +
			"where x.name = {name1} or x.fullname = {name1}\n" +
			"return distinct(p.name)")
	List<String> getCompanyProductRelation2(@Param("name1") String name1, @Param("name2") String name2);

	@Query("match (x:company)-[:`主营产品`]->(p:product)<-[:`产品小类`]-(t:product{name:{name2}})\n" +
			"where x.name = {name1} or x.fullname = {name1}\n" +
			"return distinct(p.name)")
	List<String> getCompanyProductRelation3(@Param("name1") String name1, @Param("name2") String name2);

	@Query("match (x:company)-[:`主营产品`]->(p:product)-[:`上游材料`]->(t:product{name:{name2}})\n" +
			"where x.name = {name1} or x.fullname = {name1}\n" +
			"return distinct(p.name)")
	List<String> getCompanyProductRelation4(@Param("name1") String name1, @Param("name2") String name2);

	@Query("match (x:company)-[:`主营产品`]->(p:product)<-[:`上游材料`]-(t:product{name:{name2}})\n" +
			"where x.name = {name1} or x.fullname = {name1}\n" +
			"return distinct(p.name)")
	List<String> getCompanyProductRelation5(@Param("name1") String name1, @Param("name2") String name2);

}
